package com.itheima.user.service.impl;

import com.itheima.entity.dto.LocationDto;
import com.itheima.common.ThreadLocalUtil;
import com.itheima.user.mapper.LocationMapper;
import com.itheima.user.service.LocationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

/**
 * @author :WuJunJie
 * creationTime :2022-12-14 19:35
 */
@Service

public class LocaltionServiceImpl implements LocationService {
    @Autowired
    private LocationMapper locationMapper;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public Boolean insertLocation(LocationDto locationDto) {
        // longitude 经度
        // latitude 纬度
        Point point = new Point(locationDto.getLongitude(), locationDto.getLatitude());

        // 写入坐标
        // key 存储坐标的集合名（user_localtion)
        // point 坐标数据
        // name 坐标对应的值
        redisTemplate.opsForGeo().add("userLocation", point, ThreadLocalUtil.getId());

        // 假如我叫小黑黑
        // 我的坐标是 124.221231, 24.2222
        // 想把我当前坐标写入到redis
//        Point point = new Point(124.221231, 24.2222);
//        redisTemplate.opsForGeo().add("userLocation", point, "小黑黑");

        return true;
    }

    @Override
    public GeoResults<RedisGeoCommands.GeoLocation<String>> selectLocation(LocationDto locationDto) {
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                // 包含距离
                .includeDistance()
                // 包含经纬度
                .includeCoordinates()
                // 升序
                .sortAscending()
                // 最大查询数量
                .limit(10);

        // 中心坐标
        // longitude 经度
        // latitude 纬度
        Point point = new Point(locationDto.getLongitude(), locationDto.getLatitude());

        // 距离（数值，可以用Double类型，传小数）
        // MILES 英里  = 1.609344千米
        // KILOMETERS 千米
        Distance distance = new Distance(locationDto.getDistance(), Metrics.KILOMETERS);

        // 画圆
        // 参数一：圆心
        // 参数二：半径
        Circle circle = new Circle(point, distance);

        // key 存储坐标的集合名称
        // circle 圆圈范围
        // 参数设置
        GeoResults<RedisGeoCommands.GeoLocation<String>> radius = redisTemplate.opsForGeo().radius("userLocation", circle, args);

        return radius;
    }
}
